<?php

namespace Tmj\TmjlibDev\WeekPassword;

class WeekPassword
{
    public function __construct()
    {

    }


    // 匹配小写字母
    protected  $lowercase_regex = '/[a-z]/';

    // 匹配大写字母
    protected  $uppercase_regex = '/[A-Z]/';

    // 匹配数字
    protected  $number_regex = '/\d/';

    // 匹配特殊字符
    protected  $special_char_regex = '/\W/';


    /**
     * @param $password
     * @return array
     */
    public function verifyWeekPassword($password)
    {
        $strength = 0; // 初始密码强度为0
        $msg = '';

        if(!$this->checkLength($password))
            return [
                'level' => $strength,
                'msg'   => '密码长度不符'
            ];

        //1.弱密码字典查询 2.判断重复性
        if($this->searchByDict($password) || !$this->checkRepeat($password))
            return [
                'level' => $strength,
                'msg'   => '密码过于简单'
            ];

        // 包含数字
        if($this->checkNum($password))
            $strength += 1;


        // 包含字母
        if ($this->checkWord($password)){
            $strength += 1;

            if($this->checkLowercase($password) && $this->checkUppercase($password))
                $strength += 1;

        }

        // 包含特殊字符
        if ($this->checkSpecialChar($password))
            $strength += 1;

        // 密码强度评级
        if ($strength == 1) {
            $msg = "过于简单";
        } elseif ($strength == 2) {
            $msg = "简单";
        } elseif ($strength == 3) {
            $msg = "中等";
        } elseif ($strength == 4) {
            $msg = "高";
        }

        return [
            'level' => $strength,
            'msg'   => $msg,
        ];
    }


    /**
     * 校验密码长度
     * @param $password
     * @return bool
     */
    public function checkLength($password)
    {
        $len = strlen($password);
        if($len < 6 || $len > 30)
            return false;
        return true;
    }

    /**
     * 校验是否包含数字
     * @param $password
     * @return false|int
     */
    public function checkNum($password)
    {
        return preg_match($this->number_regex, $password);
    }

    /**
     * 是否包含小写字母
     * @param $password
     * @return false|int
     */
    public function checkLowercase($password)
    {
        return preg_match($this->lowercase_regex, $password);
    }


    /**
     * 是否包含大写字母
     * @param $password
     * @return false|int
     */
    public function checkUppercase($password)
    {
        return preg_match($this->uppercase_regex, $password);
    }


    /**
     * 是否包含字母
     * @param $password
     * @return bool
     */
    public function checkWord($password)
    {
        return ($this->checkLowercase($password) || $this->checkUppercase($password));
    }

    /**
     * 是否包含除数字和字母外的字符
     * @param $password
     * @return false|int
     */
    public function checkSpecialChar($password)
    {
        return preg_match($this->special_char_regex, $password);
    }


    /**
     * 校验重复程度 过滤重复数据后字符长度不能少于4
     * @param $password
     * @return bool
     */
    public function checkRepeat($password)
    {
        $explode_password = str_split($password);   // 分割成数组
        $explode_password = array_unique($explode_password); // 取消重复数据

        if(count($explode_password) < 4)
            return false;

        return true;
    }


    /**
     * 通过字典自定义弱密码去判断
     * @param $password
     * @return bool
     */
    public function searchByDict($password)
    {
        $weekPasswordDict = config('weekPasswordDict');

        if(!empty($weekPasswordDict) && in_array($password, $weekPasswordDict))
        {
            return true;
        }
        return false;

    }

}